本文为您介绍如何迁移EMR ClickHouse中的数据至EMR Serverless StarRocks实例。
前提条件
使用限制
EMR Serverless StarRocks实例和OLAP集群需要在同一VPC下。
使用DataX同步数据
DataX介绍
DataX是阿里巴巴集团内被广泛使用的离线数据同步工具,实现了包括MySQL、Oracle、OceanBase、SqlServer、PostgreSQL、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS等各种异构数据源之间高效的数据同步功能。DataX详细信息,请参见DataX。
适用场景
适用于熟悉DataX、迁移批量数据的场景,可以一次迁移大批量数据至EMR StarRocks Serverless。
操作步骤
下载并解压缩DataX安装包。
DataX的具体使用方式请参见DataX。
配置RDBMSReader。
说明RDBMSReader是DataX内置的一个通用的关系数据库读插件,可以通过添加、注册数据库驱动等方式增加各种关系型数据库的读支持。
复制datax/plugin/writer/clickhousewriter/libs目录下的所有JAR包到datax/plugin/reader/rdbmsreader/libs目录下。
cp datax/plugin/writer/clickhousewriter/libs/* datax/plugin/reader/rdbmsreader/libs
删除datax/plugin/reader/rdbmsreader/libs目录下的guava-r05.jar。
修改datax/plugin/reader/rdbmsreader下的plugin.json文件,给
drivers
的参数值添加上,"ru.yandex.clickhouse.ClickHouseDriver"
。{ "name": "rdbmsreader", "class": "com.alibaba.datax.plugin.reader.rdbmsreader.RdbmsReader", "description": "useScene: prod. mechanism: Jdbc connection using the database, execute select sql, retrieve data from the ResultSet. warn: The more you know about the database, the less problems you encounter.", "developer": "alibaba", "drivers":["dm.jdbc.driver.DmDriver", "com.sybase.jdbc3.jdbc.SybDriver", "com.edb.Driver","ru.yandex.clickhouse.ClickHouseDriver"] }
配置StarRocks Writer。
StarRocks Writer的配置方式,请参见DataX Writer。
配置DataX的JSON脚本。
为导入作业新建一个JSON格式的文件
ck2strs.json
。{ "job": { "setting": { "speed": { "channel": 3 }, "errorLimit": { "record": 0, "percentage": 0 } }, "content": [ { "reader": { "name": "rdbmsreader", "parameter": { "username": "default", "password": "**", "column": ["**"], "connection": [ {"jdbcUrl": ["jdbc:clickhouse://<clickhouse_host>:8123/default"], "table": ["**"] } ], "where": "" } }, "writer": { "name": "starrockswriter", "parameter": { "username": "admin", "password": "**", "database": "ck", "table": "uk_price_paid_sr", "column": ["**"], "preSql": [], "postSql": [], "jdbcUrl": "jdbc:mysql://<fe_host>:<fe_query_port>", "loadUrl": [ "<fe_host>:<fe_http_port>", "<fe_host>:<fe_http_port>", "<fe_host>:<fe_http_port>" ], "loadProps": { "column_separator": "\\x03", "row_delimiter": "\\x02" } } } } ] } }
各参数含义如下表所示。
reader
参数
说明
username
ClickHouse用户名。本文使用的是ClickHouse部署完后的默认用户default,密码默认值为空。如果需要更换用户,请根据您的实际情况修改并设置相应的密码。
password
ClickHouse用户的密码。默认用户default对应的密码为空。
column
可以指定需要查询的列。
jdbcUrl
JDBC连接串。填写格式为
jdbc:clickhouse://<clickhouse_host>:<clickhouse_port>/<database_name>
。格式中各参数如下:
<clickhouse_host>
:ClickHouse的IP地址。<clickhouse_port>
:官方驱动的端口默认为8123。如果使用TCP协议的第三方驱动,则默认端口为9000。<database_name>
:ClickHouse的数据库名。
table
ClickHouse的表名称。
writer
参数
说明
username
StarRocks的管理员用户,默认为admin。
password
admin的密码。
database
StarRocks数据库的名称。
table
StarRocks表的名称。
column
可以指定需要查询的列。多个字段时之间用英文逗号(,)分隔。例如,
"column": ["id","name","age"]
。重要该参数必须指定。如果希望导入所有字段,可以使用
["*"]
。preSql
写入数据到目的表前,会先执行设置的标准语句。
postSql
写入数据到目的表后,会先执行设置的标准语句。
jdbcUrl
JDBC连接信息,用于执行preSql和postSql。填写格式为
jdbc:mysql://<fe_host>:<fe_query_port>
。loadUrl
StarRocks FE的地址,填写格式为
<fe_host>:<fe_http_port>
。
执行同步任务。
python datax/bin/datax.py --jvm="-Xms1G -Xmx1G" -p"-Dstart=$i -Dend=$end" datax/job/ck2strs.json>>/bigdata/log/ck2strs/${i}.log
说明示例代码中的Xms和Xmx ,通常建议将内存设置为
4G
或者8G
,可根据任务机的实际配置,提升-Xms与-Xmx,来防止OOM。调整JVM Xms和Xmx参数的两种方式:一种是直接更改datax.py;另一种是在启动的时候,加上对应的参数,例如
python datax/bin/datax.py --jvm="-Xms8G -Xmx8G"XXX.json
。
使用StarRocks外部表同步数据
方案介绍
该方案是通过StarRocks的外部表,将源集群数据同步至目标集群;通过JDBC方式,在目标集群创建目标表,在源集群创建外部表,将数据插入外部表实现数据迁移。
适用场景
适用于单表数据迁移的场景。如果表数量大,则操作会比较繁琐,耗时较高。
操作步骤
创建JDBC资源。
create external resource ck_jdbc properties ( "type"="jdbc", "user"="default", "password"="****", "jdbc_uri"="jdbc:clickhouse://172.16.**.**:8123/test", "driver_url"="https://****.oss-cn-****-internal.aliyuncs.com/clickhouse-jdbc-0.3.2-all.jar", "driver_class"="com.clickhouse.jdbc.ClickHouseDriver" );
相关参数如下表所示。
参数
说明
ck_jdbc
JDBC资源的名称。您可以自定义。
type
资源类型。固定值为jdbc。
user
ClickHouse用户名。本文使用的是ClickHouse部署完后的默认用户default,密码默认值为空。如果需要更换用户,请根据您的实际情况修改并设置相应的密码。
password
ClickHouse用户的密码。默认用户default对应的密码为空。
jdbc_uri
填写格式为
jdbc:clickhouse://<clickhouse_host>:<clickhouse_port>/<database_name>
。格式中各参数如下:
<clickhouse_host>
:ClickHouse的IP地址。<clickhouse_port>
:官方驱动的端口默认为8123。如果使用TCP协议的第三方驱动,则默认端口为9000。<database_name>
:ClickHouse的数据库名。
driver_url
OSS上存放驱动的内网地址。
本示例使用的是官方驱动,下载clickhouse-jdbc-0.3.2-all.jar,然后上传至OSS。
driver_class
驱动类,默认为com.clickhouse.jdbc.ClickHouseDriver。
创建完JDBC资源后,您还可以进行以下操作:
查看JDBC资源
-- 查看所有JDBC资源。 -- 说明:ResourceType列为jdbc。 SHOW RESOURCES;
删除JDBC资源
DROP RESOURCE "ck_jdbc";
说明删除JDBC资源会导致使用该JDBC资源创建的JDBC外部表不可用,但目标数据库的数据并不会丢失。删除JDBC资源后,如果您仍需通过StarRocks查询目标数据库的数据,可以重新创建JDBC资源和JDBC外部表。
创建JDBC外部表。
-- 创建外部表。 create external table uk_price_paid_ex ( price BIGINT(20) NULL COMMENT "", date String NULL COMMENT "", postcode1 String NULL COMMENT "", postcode2 String NULL COMMENT "", type String NULL COMMENT "", is_new BIGINT(20) NULL COMMENT "", duration String NULL COMMENT "", addr1 String NULL COMMENT "", addr2 String NULL COMMENT "", street String NULL COMMENT "", locality String NULL COMMENT "", town String NULL COMMENT "" , district String NULL COMMENT "", county String NULL COMMENT "" ) ENGINE=jdbc properties ( "resource"="ck_jdbc", "table"="uk_price_paid", "compression"="ZSTD" );
说明不支持索引。
不支持通过PARTITION BY、DISTRIBUTED BY来指定数据分布规则。
创建数据表。
适用于所有数据模型。
create table uk_price_paid ( price BIGINT(20) NULL COMMENT "", date DATE NULL COMMENT "", postcode1 String NULL COMMENT "", postcode2 String NULL COMMENT "", type String NULL COMMENT "", is_new BIGINT(20) NULL COMMENT "", duration String NULL COMMENT "", addr1 String NULL COMMENT "", addr2 String NULL COMMENT "", street String NULL COMMENT "", locality String NULL COMMENT "", town String NULL COMMENT "" , district String NULL COMMENT "", county String NULL COMMENT "" ) ENGINE=OLAP duplicate key (price) distributed by hash(date) buckets 32 properties( "replication_num"="1" );
插入数据。
insert into uk_price_paid select * from uk_price_paid_ex;
常见问题
问题报错
ERROR 1064 (HY000): Type is not supported on column[date1], JDBC result type is [java.time.LocalDate]
操作详情如下图所示。
解决方式
该问题主要是ClickHouse和StarRocks的date字段类型不匹配导致的。您可以先修改ClickHouse表中的date字段类型为String或其他类型,然后设置StarRocks目标表为DATE类型,最后数据插入StarRocks目标表时会自动转换类型。